/* eslint-disable no-param-reassign */
import axios from 'axios'
import qs from 'qs'
import store from '@/store'
import router from '@/router'
import i18n from '@/lang'
import {
  VueAxios
} from './axios'
import notification from 'ant-design-vue/es/notification'
import message from 'ant-design-vue/es/message'
import {
  ACCESS_TOKEN
} from '@/store/mutationTypes'
// 创建 axios 实例
const service = axios.create({
  // baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url
  // timeout: process.env.REQUEST_TIMEOUT || 30000// 请求超时时间Y
  // changeOrigin:true
})
// 拦截错误处理
const err = (error) => {
  if (error.response) {
    if (error.response.status === 403) {
      // 无权限
      // router.push({
      //   path: '/403/inner'
      // })
      message.error("您没有访问权限！");
    } else if (error.response.status === 401) {
      // sessionStorage.removeItem(ACCESS_TOKEN)
      if (!store.getters.permissionTags.length) {
        return Promise.reject(error);
      }
      notification.error({
        message: i18n.t('error'),
        description:  i18n.t('登录超时，请重新登录'),
        showClose: true
      });
      store.commit('RESET_USER_STATE');
      if (error.config.url.indexOf("/user-service/user/info/current") >= 0) {
        //获取登录信息接口，不弹框，直接失败
        return Promise.reject(error);
      }
      if (process.env.NODE_ENV === 'development') {
        store.commit('toggleInnerLogin', true);
      } else if (error.config.method.toLowerCase() !== 'get' && process.env.VUE_APP_SSO_BASE_URL) {
        //sso弹框登录无法复用cookie保持sso登录状态，每次都只能重新登录，故只有非get请求进行弹框登录
        store.commit('toggleSsoLogin', true);
      } else {
        router.push({
          path: '/user/login?redirect=' + encodeURIComponent(location.hash && location.hash.split('#')[1])
        });
      }
      return Promise.reject(error);

      //return
      /*window.location.reload()
      // 认证不通过
      const token = sessionStorage.getItem(ACCESS_TOKEN)
      if (token) {
        notification.error({
          message: i18n.t('error'),
          description: i18n.t('loginTimeoutTip')
        })
        sessionStorage.removeItem(ACCESS_TOKEN)
        router.push({
          path: '/403'
        })
        window.location.reload()
      }*/
    } else {
      notification.error({
        message: i18n.t('error'),
        description: i18n.t('requestErrorTip')
      })
    }
  }
  if (error.code === 'ECONNABORTED' || (error.response && error.response.status === 504)) {
    notification.error({
      message: i18n.t('error'),
      description:  i18n.t('请求超时'),
      showClose: true
    })
  }
  console.log('请求失败', error)
  return Promise.reject(error)
}
// 配置后端对应的语言包的值(key是前端所需要的值,value是后端所需要的值)
const languageConfigs = {
  'en': 'en-US',
  'zh': 'zh-CN',
  'zhCN': 'zh-CN',
  'zhTW': 'zh-TW'
}
// 请求拦截配置
const requestConfig = (config) => {
  // 如果请求中没有传baseURL则使用动态配置（只有mock数据的时候请求中才会传baseURL）
  if (!config.baseURL) {
    config.baseURL = process.env.NODE_ENV === 'development' ? '/' : process.env.VUE_APP_API_BASE_URL
  }
  // 没有特殊超时限制的就用统一配置的（只有软件上传包和上传版本才有特殊限制）
  if (!config.timeout) {
    config.timeout = process.env.REQUEST_TIMEOUT || 40000
  }
  const token = sessionStorage.getItem(ACCESS_TOKEN)
  if (token) {
    config.headers['Access-Token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
  }
  if (config.method === 'get') {
    config.paramsSerializer = function (params) {
      return qs.stringify(params, { arrayFormat: 'repeat' })
    }
  }
  console.log(store.getters.locale, 'store.getters.locale')
  config.headers['Accept-Language'] = `${languageConfigs[store.getters.locale]},zh;q=0.9`
  config.headers['From-Path'] = location.hash ? location.hash.split('#')[1] : '';
  return config
}
// 添加请求拦截 request interceptor
service.interceptors.request.use(requestConfig, err)

// 响应成功处理
const respondSuccess = (response) => {
  // 每次请求更新token
//   if (response.headers && response.headers['Access-Token']) {
//   store.commit('SET_TOKEN', response.headers['Access-Token'])
  //   }
  const res = response.data
  console.log(response, 'response')
  // 请求失败
  if (res.code && res.code !== '0' && res.code !== 0) {
    notification.error({
      message: i18n.t('error'),
      description: response.message || i18n.t(res.message) || i18n.t('requestErrorTip'),
      showClose: true
    })
    return Promise.reject(res)
  }
  return res

  //  自己修改之前只有这一行代码
  // return response.data
}
// 添加响应拦截 response interceptor
service.interceptors.response.use(respondSuccess, err)

const installer = {
  vm: {},
  install (Vue) {
    Vue.use(VueAxios, service)
  }
}

export {
  installer as VueAxios,
  service as axios
}
